using System;
using System.Data;

namespace SharpObjects.Data
{

	public class DataParameterAccessor
	{
        protected IDb db;
		protected IDataParameterCollection parameters;

		public DataParameterAccessor(IDb db, IDataParameterCollection parameters)
		{
            this.db = db;
			this.parameters = parameters;
		}

		public IDataParameterCollection Parameters { get { return this.parameters; } }

		public bool? GetBoolean(string parameterName)
		{
			IDataParameter parameter = GetParameter(parameterName);

			if (parameter.Value == null || parameter.Value == DBNull.Value)
			{
                return null;
			}

			return Convert.ToBoolean(parameter.Value);
		}
 
		public bool GetBoolean(string parameterName, bool defaultValue)
		{
			IDataParameter parameter = GetParameter(parameterName);

			if (parameter.Value == null || parameter.Value == DBNull.Value)
			{
                return defaultValue;
			}

			return Convert.ToBoolean(parameter.Value);
		}
 
		public DateTime? GetDateTime(string parameterName)
		{
			IDataParameter parameter = GetParameter(parameterName);

			if (parameter.Value == null || parameter.Value == DBNull.Value)
			{
                return null;
			}

			return Convert.ToDateTime(parameter.Value);
		}
 
		public DateTime GetDateTime(string parameterName, DateTime defaultValue)
		{
			IDataParameter parameter = GetParameter(parameterName);

			if (parameter.Value == null || parameter.Value == DBNull.Value)
			{
                return defaultValue;
			}

			return Convert.ToDateTime(parameter.Value);
		}
 
		public double? GetDouble(string parameterName)
		{
			IDataParameter parameter = GetParameter(parameterName);

			if (parameter.Value == null || parameter.Value == DBNull.Value)
			{
                return null;
			}

			return Convert.ToDouble(parameter.Value);
		}
 
		public double GetDouble(string parameterName, double defaultValue)
		{
			IDataParameter parameter = GetParameter(parameterName);

			if (parameter.Value == null || parameter.Value == DBNull.Value)
			{
				return defaultValue;
			}

			return Convert.ToDouble(parameter.Value);
		}
 
		public int? GetInteger(string parameterName)
		{
			IDataParameter parameter = GetParameter(parameterName);

			if (parameter.Value == null || parameter.Value == DBNull.Value)
			{
                return null;
			}

			return Convert.ToInt32(parameter.Value);
		}
 
		public int GetInteger(string parameterName, int defaultValue)
		{
			IDataParameter parameter = GetParameter(parameterName);

			if (parameter.Value == null || parameter.Value == DBNull.Value)
			{
				return defaultValue;
			}

			return Convert.ToInt32(parameter.Value);
		}
 
		public string GetString(string parameterName)
		{
			IDataParameter parameter = GetParameter(parameterName);

			if (parameter.Value == null || parameter.Value == DBNull.Value)
			{
                return null;
			}

			return parameter.Value.ToString();
		}
 
		public string GetString(string parameterName, string defaultValue)
		{
			IDataParameter parameter = GetParameter(parameterName);

			if (parameter.Value == null || parameter.Value == DBNull.Value)
			{
				return defaultValue;
			}

			return parameter.Value.ToString();
		}

		protected IDataParameter GetParameter(string parameterName)
		{
            if (!parameterName.StartsWith(this.db.ParameterPrefix))
            {
                parameterName = this.db.ParameterPrefix + parameterName;
            }

			IDataParameter parameter = this.parameters[parameterName] as IDataParameter;
			return parameter;
		}
 

	}
}
